package io.gitee.welson.sensitive.service;

import io.gitee.welson.sensitive.model.ExportParams;
import io.gitee.welson.sensitive.model.SheetData;

import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.util.List;

/**
 * 敏感数据导出服务接口
 * 定义了基本的数据导出操作
 *
 * @author welson
 */
public interface SensitiveExportService {

    /**
     * 导出数据到Excel（使用自定义导出参数）
     *
     * @param response HTTP响应对象
     * @param params 导出参数
     * @param data 数据列表
     * @param dataClass 数据类型
     * @param <T> 数据泛型
     */
    <T> void export(HttpServletResponse response, ExportParams params, List<T> data, Class<T> dataClass);

    /**
     * 导出数据到Excel
     *
     * @param response HTTP响应对象
     * @param fileName 文件名
     * @param data 数据列表
     * @param dataClass 数据类型
     * @param <T> 数据泛型
     */
    <T> void export(HttpServletResponse response, String fileName, List<T> data, Class<T> dataClass);

    /**
     * 导出数据到多个sheet（使用自定义导出参数）
     *
     * @param response    HTTP响应对象
     * @param params     导出参数
     * @param sheetDatas  sheet数据映射，key为sheet名称，value为数据列表
     * @param dataClass   数据类型
     * @param <T>        数据泛型
     */
    <T> void exportMultiSheet(HttpServletResponse response, ExportParams params, List<SheetData<T>> sheetDatas, Class<T> dataClass);

    /**
     * 导出数据到多个sheet
     *
     * @param response    HTTP响应对象
     * @param fileName    导出文件名
     * @param sheetDatas  sheet数据映射，key为sheet名称，value为数据列表
     * @param dataClass   数据类型
     * @param <T>        数据泛型
     */
    <T> void exportMultiSheet(HttpServletResponse response, String fileName, List<SheetData<T>> sheetDatas, Class<T> dataClass);

    /**
     * 分批导出数据（使用自定义导出参数）
     *
     * @param response     HTTP响应对象
     * @param params      导出参数
     * @param dataSupplier 数据提供者，用于分批获取数据
     * @param batchSize    每批数据大小
     * @param dataClass    数据类型
     * @param <T>         数据泛型
     */
    <T> void exportBatch(HttpServletResponse response, ExportParams params, DataSupplier<T> dataSupplier, int batchSize, Class<T> dataClass);

    /**
     * 分批导出数据
     *
     * @param response     HTTP响应对象
     * @param fileName     导出文件名
     * @param dataSupplier 数据提供者，用于分批获取数据
     * @param batchSize    每批数据大小
     * @param dataClass    数据类型
     * @param <T>         数据泛型
     */
    <T> void exportBatch(HttpServletResponse response, String fileName, DataSupplier<T> dataSupplier, int batchSize, Class<T> dataClass);

    /**
     * 使用迭代器批量导出数据（使用自定义导出参数）
     * @param response HTTP响应对象
     * @param params      导出参数
     * @param iterator 数据迭代器
     * @param dataClass 数据类型
     * @param <T> 数据类型
     */
    <T> void exportWithIterator(HttpServletResponse response, ExportParams params, BatchDataIterator<T> iterator, Class<T> dataClass);

    /**
     * 使用迭代器批量导出数据
     * @param response HTTP响应对象
     * @param fileName     导出文件名
     * @param iterator 数据迭代器
     * @param dataClass 数据类型
     * @param <T> 数据类型
     */
    <T> void exportWithIterator(HttpServletResponse response, String fileName, BatchDataIterator<T> iterator, Class<T> dataClass);

    /**
     * 导出数据到指定文件路径（使用自定义导出参数）
     *
     * @param filePath 文件路径
     * @param params 导出参数
     * @param data 数据列表
     * @param dataClass 数据类型
     * @param <T> 数据泛型
     */
    <T> void exportToFile(String filePath, ExportParams params, List<T> data, Class<T> dataClass);

    /**
     * 导出数据到指定文件路径
     *
     * @param filePath 文件路径
     * @param data 数据列表
     * @param dataClass 数据类型
     * @param <T> 数据泛型
     */
    <T> void exportToFile(String filePath, List<T> data, Class<T> dataClass);

    /**
     * 导出数据到多个sheet并保存到指定文件路径（使用自定义导出参数）
     *
     * @param filePath    文件路径
     * @param params     导出参数
     * @param sheetDatas  sheet数据映射，key为sheet名称，value为数据列表
     * @param dataClass   数据类型
     * @param <T>        数据泛型
     */
    <T> void exportMultiSheetToFile(String filePath, ExportParams params, List<SheetData<T>> sheetDatas, Class<T> dataClass);

    /**
     * 导出数据到多个sheet并保存到指定文件路径
     *
     * @param filePath    文件路径
     * @param sheetDatas  sheet数据映射，key为sheet名称，value为数据列表
     * @param dataClass   数据类型
     * @param <T>        数据泛型
     */
    <T> void exportMultiSheetToFile(String filePath, List<SheetData<T>> sheetDatas, Class<T> dataClass);

    /**
     * 分批导出数据到指定文件路径（使用自定义导出参数）
     *
     * @param filePath     文件路径
     * @param params      导出参数
     * @param dataSupplier 数据提供者，用于分批获取数据
     * @param batchSize    每批数据大小
     * @param dataClass    数据类型
     * @param <T>         数据泛型
     */
    <T> void exportBatchToFile(String filePath, ExportParams params, DataSupplier<T> dataSupplier, int batchSize, Class<T> dataClass);

    /**
     * 分批导出数据到指定文件路径
     *
     * @param filePath     文件路径
     * @param dataSupplier 数据提供者，用于分批获取数据
     * @param batchSize    每批数据大小
     * @param dataClass    数据类型
     * @param <T>         数据泛型
     */
    <T> void exportBatchToFile(String filePath, DataSupplier<T> dataSupplier, int batchSize, Class<T> dataClass);

    /**
     * 使用迭代器批量导出数据到指定文件路径（使用自定义导出参数）
     * @param filePath 文件路径
     * @param params      导出参数
     * @param iterator 数据迭代器
     * @param dataClass 数据类型
     * @param <T> 数据类型
     */
    <T> void exportWithIteratorToFile(String filePath, ExportParams params, BatchDataIterator<T> iterator, Class<T> dataClass);

    /**
     * 使用迭代器批量导出数据到指定文件路径
     * @param filePath 文件路径
     * @param iterator 数据迭代器
     * @param dataClass 数据类型
     * @param <T> 数据类型
     */
    <T> void exportWithIteratorToFile(String filePath, BatchDataIterator<T> iterator, Class<T> dataClass);

    /**
     * 数据提供者接口
     * 用于分批获取数据
     *
     * @param <T> 数据类型
     */
    @FunctionalInterface
    interface DataSupplier<T> {
        /**
         * 获取下一批数据
         *
         * @param offset    偏移量
         * @param batchSize 批次大小
         * @return 数据列表
         */
        List<T> get(int offset, int batchSize);
    }
} 